
// 15 函数的类型
// ts 规范的是 参数和返回值的类型
// function fn() {
//     console.log(100);
// }
// fn();

// 如果没有返回值，则需要写清除返回值的类型
function fn(): void {
    console.log(100);
}
// fn();

// 有参数
function fn1(x: number): void {
    // x = 'hello';
    console.log(x);

    // 强行return也不行
    // return x;
}
// fn1(10);
// 有参数不传值也不行
// fn1();

// 函数表达式
// 形参如果有批注，要加上括号
// 返回值的类型，在形参后面
// const func1 = (num: number, str: string): string => {
//     // console.log(num + str);
//     return num + str;
// }
const func1 = (num: number, str: string): string => num + str;
// func1();
// console.log(func1(10, 'px'));



// 15.1 如果把函数作为模板，返回值的类型就必须写到箭头的后面
// let templateFn: (x: number, y: string) => string; 
// let templateFn: (x: number, y: string) => string;

// // 赋值对应的函数类型
// templateFn = function(x: number, y: string) {
//     return x + y;
// }
// console.log(templateFn(10, '20'));


// 15.2 可选参数
// function getStr(str: string, n1: number, n2 ?: number): string {
//     return str.slice(n1, n2)
// }

// // console.log(getStr('helloworld.', 0, 5));
// // console.log(getStr('helloworld.', 5, -1));
// console.log(getStr('helloworld.', 5));


// 15.3 函数参数的默认值
// 不传指定的参数就使用默认值，传入了指定的值，就是该值
function city(name: string, des: string = '省', n: number): string {
    return name + des;
}

// 如果在传入的时候，想缺省参数，不要不写，也不要写undefined以外的值
console.log(city('湖北', undefined, 20));


